From: Jonas Dreßler Date: Mon, 1 Feb 2021 10:51:27 +0000 (+0100) Subject: windowPreview: Cache the boundingBox of the layout manager X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~517 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=959639bdc9ba75bf3d85c7827f4519df957c99f2;p=gnome-shell.git windowPreview: Cache the boundingBox of the layout manager Accessing GObject properties from JS has proven to be quite slow because of the JS->C->JS roundtrip involved. With the WindowPreview this actually has an impact since we're accessing those properties very often while creating new layouts. So cache the boundingBox and the windowCenter properties of the WindowPreview using a this._cachedBoundingBox JS object. This might speed up opening the overview with lots of open windows significantly. Part-of: --- diff --git a/js/ui/windowPreview.js b/js/ui/windowPreview.js index 23a353ef5..f6d1490a3 100644 --- a/js/ui/windowPreview.js +++ b/js/ui/windowPreview.js @@ -231,8 +231,22 @@ var WindowPreview = GObject.registerClass({ this._stackAbove = null; + this._cachedBoundingBox = { + x: this._windowContainer.layout_manager.bounding_box.x1, + y: this._windowContainer.layout_manager.bounding_box.y1, + width: this._windowContainer.layout_manager.bounding_box.get_width(), + height: this._windowContainer.layout_manager.bounding_box.get_height(), + }; + this._windowContainer.layout_manager.connect( 'notify::bounding-box', layout => { + this._cachedBoundingBox = { + x: layout.bounding_box.x1, + y: layout.bounding_box.y1, + width: layout.bounding_box.get_width(), + height: layout.bounding_box.get_height(), + }; + // A bounding box of 0x0 means all windows were removed if (layout.bounding_box.get_area() > 0) this.emit('size-changed'); @@ -561,23 +575,14 @@ var WindowPreview = GObject.registerClass({ } get boundingBox() { - const box = this._windowContainer.layout_manager.bounding_box; - - return { - x: box.x1, - y: box.y1, - width: box.get_width(), - height: box.get_height(), - }; + return { ...this._cachedBoundingBox }; } get windowCenter() { - const box = this._windowContainer.layout_manager.bounding_box; - - return new Graphene.Point({ - x: box.get_x() + box.get_width() / 2, - y: box.get_y() + box.get_height() / 2, - }); + return { + x: this._cachedBoundingBox.x + this._cachedBoundingBox.width / 2, + y: this._cachedBoundingBox.y + this._cachedBoundingBox.height / 2, + }; } // eslint-disable-next-line camelcase